﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;

namespace Server
{
    [ServiceContract]
    [ServiceKnownType(typeof(ServiceDevice))]
    public interface IRssFeedService
    {
        /// <summary>
        /// Débute une session
        /// </summary>
        /// <param name="email">L'email de l'utilisateur</param>
        /// <param name="password">Le mot de passe de l'utilisateur</param>
        /// <param name="version">La plateforme depuis laquel se connecte l'utililsateur (ServiceDevice Enum)</param>
        /// <returns>La session de l'utilisateur a utilisé pour les appels suivants.</returns>
        [OperationContract]
        Session startSession(String email, String password, ServiceDevice version);

        /// <summary>
        /// Termine une session
        /// </summary>
        /// <param name="session">La session de l'utilisateur obtenu via l'appel a startSession</param>
        /// <returns>Entier contenant une valeur de succés (1) ou d'echec (0)</returns>
        [OperationContract]
        ServiceStatus endSession(Session session);

        /// <summary>
        /// Liste les flux Rss Auquel est inscrit l'utilisateur
        /// </summary>
        /// <param name="session">La session de l'utilisateur obtenu via l'appel a StartSession</param>
        /// <returns>La liste des flux Rss (RssFeed Object)</returns>
        [OperationContract]
        List<RssFeed> ListRssFeed(Session session);

        [OperationContract]
        List<RssFeed> ListPublicRssFeed(Session session);

        /// <summary>
        /// Liste les items d'un flux Rss
        /// </summary>
        /// <param name="session">La session de l'utilisateur obtenu via l'appel a StartSession</param>
        /// <param name="rss_feed">Le flux Rss dont on souhaite connaitre les items</param>
        /// <returns>La liste des items du flux Rss selectioné (RssFeedItem Object)</returns>
        [OperationContract]
        List<RssFeedItem> ListRssFeedItem(Session session, RssFeed rss_feed);

        /// <summary>
        /// Abonnement de l'utilisateur a un flux Rss
        /// </summary>
        /// <param name="session">La session de l'utilisateur obtenu via l'appel a StartSession</param>
        /// <param name="rss_feed">Le flux Rss auquel s'abonner</param>
        /// <returns>Entier contenant une valeur de succés (1) ou d'echec (0)</returns>
        [OperationContract]
        RssFeed Subscribe(Session session, RssFeed rss_feed);

        /// <summary>
        /// Liste les 10 derniers items de tout les flux confondu auquel est inscrit l'utilisateur
        /// </summary>
        /// <param name="session">La session de l'utilisateur obtenu via l'appel a StartSession</param>
        /// <returns>La liste des derniers item (RssFeedItem Object)</returns>
        [OperationContract]
        List<RssFeedItem> ListLastRssFeedItem(Session session, bool no_read);

        /// <summary>
        /// Oblige le serveur a mettre a jour un flux RSS (récupération des nouveaux items)
        /// </summary>
        /// <param name="session">La session de l'utilisateur obtenu via l'appel a StartSession</param>
        /// <param name="rss_feed">Le flux a mettre a jour</param>
        /// <returns>Le flux Rss qui a ete mis a jour (faire un ListRssFeedItem pour obtenir les nouveaux items)</returns>
        [OperationContract]
        RssFeed RefreshRssFeed(Session session, RssFeed rss_feed);

        /// <summary>
        /// Modifie le status "Lu" de l'item
        /// </summary>
        /// <param name="session">La session de l'utilisateur obtenu via l'appel a StartSession</param>
        /// <param name="item">L'item pour lequel le statut change</param>
        /// <param name="read">True ou False ("lu" ou "non lu")</param>
        /// <returns>L'item mis a jour aprés modification (RssFeedItem Object)</returns>
        [OperationContract]
        RssFeedItem ReadSate(Session session, RssFeedItem item, bool read);
    }
}
